package cn.cjxy.springbootdemo1.controller;

import cn.cjxy.springbootdemo1.domain.User;
import cn.cjxy.springbootdemo1.domain.UserPro;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 请求参数
 * @author huangjie
 * @date 2025/10/14
 */
@RestController
@RequestMapping("/request")
public class RequestController {
    /**
     * 通过request获取请求参数--不建议使用
     * @param request
     * @return
     */
    @RequestMapping("/requestParam")
    public String requestParam(HttpServletRequest request) {
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println(name+"------------"+age);
        return "请求成功！！！！！";
    }

    /**
     * ### 形参接收-普通参数
     *
     * #### 2.1.参数名一致   可自动匹配
     * @param name
     * @param age
     * @return
     */
    @RequestMapping("/simpleParam")
    public String simpleParam(String name,Integer age) {
        System.out.println(name+"------------"+age);
        return "请求成功！！！！！";
    }

    /** #### 2.1.参数不一致
     * - @RequestParam属性
     *   - value：指定前端传递的参数名称
     *   - required：此参数是否必填，默认为true，如果使用默认为true的属性值前端没有传递此参数时会响应400
     * @param name
     * @param age
     * @return
             */
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam("name2") String name, Integer age) {
        System.out.println(name+"------------"+age);
        return "请求成功！！！！！";
    }

    /**
     * ### 3.形参接收-实体参数
     *
     * - **虽然可以使用形参接收简单参数，但是如果参数个数比较多那么这种方式就会非常麻烦**
     * - **当参数比较多时我们可以选择使用实体参数进行接收，实体类字段名称必须跟前端传递的参数名称一致，否则映射失败**
     * @param user
     * @return
     */
    @RequestMapping("/domainParam")
    public String domainParam(User  user) {
        System.out.println(user);
        return "实体请求成功！！";
    }

    /**
     * post方式请求，前端传递json对象  常用
     * @param user
     * @return
     */
    @RequestMapping(value = "/domainParampost",method = RequestMethod.POST)
    public String domainParampost(@RequestBody User  user) {
        System.out.println(user);
        return "实体请求成功！！";
    }

    /**
     * #### 3.2.复杂实体参数
     *
     * - 复杂实体指的是在实体类中不仅有普通类型字段，还有一个或多个实体类字段，例如User对象中还有Address对象
     * - 如果想要映射参数到复杂实体对象中那么与简单实体略有区别
     * -
     * @param user
     * @return
     */
    @RequestMapping("/complexdomainParam")
    public String complexDomainParam(UserPro user) {
        System.out.println(user);
        return "复杂实体请求成功！！";
    }

    /**
     * 4.形参接收-数组集合参数
     * @param user
     * @return
     */
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] user) {
        for (String s : user) {
            System.out.println(s);
        }

        return "数组参数请求成功！！";
    }

    /**
     * 4.2.集合参数
     * @param user
     * @return
     */
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> user) {
        System.out.println(user);

        return "集合参数请求成功！！";
    }

    /**
     * 传递json数组
     * @param user
     * @return
     */
    @RequestMapping(value = "/jsonParam",method = RequestMethod.POST)
    public String jsonParam(@RequestBody List<String> user) {
        System.out.println(user);

        return "集合参数请求成功！！";
    }

    /**
     * 7.形参接收-路径参数
     * - 前端传递：通过URI传递参数
     * - 后端接收：在路径中使用{…}来标识该路径参数，形参前面需要使用@PathVariable("{}中的名称")注解来获取路径参数
     * http://localhost:8081/request/urlParam/1/2
     * @return
     */
    @RequestMapping("/urlParam/{id}/{number}")
    public String urlParam(@PathVariable("id") String user_id, @PathVariable("number") int user_number) {
        System.out.println(user_id+"-------"+user_number);

        return "集合参数请求成功！！";
    }

}
